package com.etc.aop.springaop.annotation;

import java.util.Date;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;

/**
 * 通用的业务部分 ;例如 日志记录,通用的执行效率检查
 * 
 * @author Administrator
 *
 */
@Aspect
@Component
@EnableAspectJAutoProxy
public class LogAop {

	/**
	 * 这个方法是在 某个类的方法执行之前执行的 ，此方法可以认为是前置通知的方法
	 */
	
	@Before(value = "execution(* com.etc.aop.springaop.annotation.ClassGrass.giveFlower(..))")
	public void before() {
		System.out.println("********要代理的方法准备执行*************" + new Date().toLocaleString());
	}

	@After(value="execution(* com.etc.aop.springaop.annotation.ClassGrass.giveFlower(..))")
	public void after() {
		System.out.println("********要代理的方法执行完毕*************" + new Date().toLocaleString());
	}

	/**
	 * 环绕通知
	 * @param pjp
	 * @return
	 * @throws Throwable
	 */
	@Around(value="execution(* com.etc.aop.springaop.annotation.ClassGrass.giveFlower(..))")
	public Object around(ProceedingJoinPoint pjp) throws Throwable {

		// pjp调用对应的那个方法
		System.out.println("********around 要代理的方法准备执行*************" + new Date().toLocaleString());
		Object result = pjp.proceed();
		System.out.println("********around 要代理的方法准备执行*************" + new Date().toLocaleString());
		return result;
	}
}
